package com.cd.music.controller;

import com.cd.music.annotation.Auth;
import com.cd.music.annotation.Parameter;
import com.cd.music.annotation.RequestLimit;
import com.cd.music.dto.ContentDto;
import com.cd.music.dto.ResultBean;
import com.cd.music.dto.UserDto;
import com.cd.music.service.AdvertisingService;
import com.cd.music.service.NewsService;
import com.cd.music.service.UserService;
import com.cd.music.utils.CookieUtil;
import com.cd.music.utils.ResultUtil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * 用户管理控制器
 *
 * @author yxl 余秀良
 * @version 1.0
 * @description: 用户管理控制器
 * @date 2018年02月28日  上午10:58
 * @address: 四川成都
 */
@Controller
@CrossOrigin
@RequestMapping("user/manager")
public class UserController {
    @Resource(name = "userService")
    private UserService userService;
    @Resource(name = "advertisingService")
    private AdvertisingService advertisingService;
    @Resource(name = "newsService")
    private NewsService newsService;

    /**
     * 管理员管理用户
     *
     * @return 返回操作信息
     */
    @ResponseBody
    @PostMapping("admin/disable/user")
    @Auth(roles = "admin", sign = {0}, description = "只有超级管理员可以访问")
    public String disableUserAccount(@Parameter UserDto dto) {
        return ResultUtil.result(userService.disableUserAccount(dto));
    }

    /**
     * 管理员登录
     *
     * @param dto 　参数
     * @return 登录信息
     */
    @ResponseBody
    @RequestLimit(count = 2)
    @PostMapping("admin/login")
    public String adminLogin(@Parameter UserDto dto) {
        return ResultUtil.result(userService.adminLogin(dto));
    }

    /**
     * 用户登录
     *
     * @param dto 　参数
     * @return 返回登录信息
     */
    @RequestLimit(count = 2)
    @PostMapping("user/login")
    public String userLogin(HttpServletRequest request, @Parameter UserDto dto, Model model) {
        ResultBean resultBean = userService.login(dto);
        if (!resultBean.getIsSuccess()) {
            model.addAttribute("error", resultBean.getMessage());
            return "login";
        }
        model.addAttribute("advertising", advertisingService.select(null));
        model.addAttribute("news", newsService.select(ContentDto.builder().pageIndex(1).pageSize(3).build()));
        Map userInfoMap = resultBean.getData();
        model.addAttribute("user", userInfoMap);
        //用户信息存入session，方便展示
        request.getSession().setAttribute("userInfo", userInfoMap);
        return "home";
    }

    /**
     * 用户注册
     *
     * @param dto 　参数
     * @return 返回注册信息
     */
    @RequestLimit(count = 2)
    @PostMapping("user/register")
    public String register(@Parameter UserDto dto, Model model) {
        ResultBean resultBean = userService.register(dto);
        if (resultBean.getIsSuccess()) {
            model.addAttribute("message", resultBean.getMessage());
            return "login";
        } else {
            model.addAttribute("error", resultBean.getMessage());
            return "register";
        }

    }

    /**
     * @author yxl 余秀良
     * @version 1.0
     * @description: 修改密码
     * @date 2018年03月06日 下午4:43
     * @address: 四川成都
     */
    @PostMapping("user/updatePwd")
    public String updatePwd(@Parameter UserDto dto, Model model) {
        ResultBean resultBean = userService.userUpdatePwd(dto);
        if (resultBean.getIsSuccess()) {
            return "update_success";
        } else {
            model.addAttribute("error", resultBean.getMessage());
            return "update_pwd";
        }
    }

    /**
     * @author yxl 余秀良
     * @version 1.0
     * @description: 修改密码
     * @date 2018年03月06日 下午4:43
     * @address: 四川成都
     */
    @Auth(roles = "admin", sign = {0, 1}, description = "只有管理员和超级管理员可以访问")
    @ResponseBody
    @PostMapping("admin/updatePwd")
    public String adminUpdatePwd(@Parameter UserDto dto) {
        return ResultUtil.result(userService.adminUpdatePwd(dto));
    }

    /**
     * @author yxl 余秀良
     * @version 1.0
     * @description: 登录记录查询
     * @date 2018年03月08日 下午3:55
     * @address: 四川成都
     */
    @Auth(roles = "admin", sign = {0, 1}, description = "只有管理员和超级管理员可以访问")
    @ResponseBody
    @RequestMapping("login/record")
    public String loginRecord(@Parameter UserDto dto) {
        return ResultUtil.result(userService.loginRecord(dto));
    }

    /**
     * @author yxl 余秀良
     * @version 1.0
     * @description: 管理员查询用户列表
     * @date 2018年03月12日 上午11:38
     * @address: 四川成都
     */
    @ResponseBody
    @RequestMapping("admin/user/list")
    @Auth(roles = "admin", sign = {0, 1}, description = "只有管理员和超级管理员可以访问")
    public String userList(@Parameter UserDto dto) {
        return ResultUtil.result(userService.selectUserList(dto));
    }

    /**
     * 普通用户退出
     *
     * @return 返回首页模板
     */
    @RequestMapping("user/logout")
    public String logout(HttpServletRequest request) {
        request.getSession().removeAttribute("userInfo");
        CookieUtil.remove("token");
        return "redirect:/content/index";
    }
}
